//
// 设计一个有getMin功能的栈
// Created by Liming Shao on 23/10/2017.
//

#include "A001.h"
#include <iostream>

int A001::pop() {
    if(StackA.empty()){
        std::cout << "No data in stack" << std::endl;
        return -1;
    }

    int tmp = StackA.top();
    if(StackA.top() == StackB.top()){
        StackB.pop();
        StackA.pop();
    }else{
        while(StackB.top() != tmp){
            StackA.push((StackB.top()));
            StackB.pop();
        }
        StackB.pop();
        while(StackA.top() != tmp){
            StackB.push((StackA.top()));
            StackA.pop();
        }
        StackA.pop();
    }
    return tmp;
}

void A001::push(int val) {
    StackA.push(val);

    if(StackB.empty() || val <= StackB.top()){
        StackB.push(val);
    }else{
        while (val > StackB.top()){
            StackA.push((StackB.top()));
            StackB.pop();
            if(StackB.empty())
                break;
        }
        StackB.push(val);
        while(StackA.top() != val) {
            StackB.push((StackA.top()));
            StackA.pop();
        }
    }
}

int A001::getMin() {
    if(StackB.empty()){
        std::cout << "No data in stack" << std::endl;
        return -1;
    }

    return StackB.top();
}

void A001::test() {
    push(8);
    push(3);
    push(3);
    push(4);
    pop();
    pop();
    push(4);
    push(2);
    push(9);
    pop();
    pop();
    std::cout << getMin() << std::endl;
}
